package com.jzo2o.health.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.trade.enums.PayChannelEnum;
import com.jzo2o.common.model.msg.TradeStatusMsg;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.health.model.domain.Orders;
import com.jzo2o.health.model.dto.request.PlaceOrderReqDTO;
import com.jzo2o.health.model.dto.response.*;
import com.jzo2o.health.model.dto.request.OrdersPageQueryReqDTO;

import java.util.List;

/**
 * @author xd
 * @author liush
 * @date 2024/12/25
 * @description 订单
 */
public interface IOrdersService extends IService<Orders> {

    /**
     * @author xd
     * 下单接口
     * @param placeOrderReqDTO {@code PlaceOrderReqDTO}下单请求信息
     * @return {@code PlaceOrderResDTO}下单响应信息
     */
    PlaceOrderResDTO placeOrder(PlaceOrderReqDTO placeOrderReqDTO);

    /**
     * @author xd
     * 保存订单并修改预约人数
     * @param orders {@code Orders}订单实体类
     */
    void saveOrdersAndUpdateReservation(Orders orders,Integer reservationId) throws InterruptedException;
    /**
     * @author xd
     * 订单支付申请
     * @param id {@code Long}订单id
     * @param tradingChannel {@code PayChannelEnum} 支付渠道
     * @return {@code OrdersPayResDTO} 订单支付响应体
     */
    OrdersPayResDTO pay(Long id, PayChannelEnum tradingChannel);

    /**
     * @author xd
     * 手动获取支付结果
     * @param id {@code Long} 订单id
     * @return {@code OrdersPayResDTO} 订单支付响应体
     */
    OrdersPayResDTO getPayResult(Long id);

    /**
     * 更新支付结果
     *
     * @author XingDong
     */
    void paySuccess(TradeStatusMsg tradeStatusMsg);

    /**
     * 分页查询
     * @param ordersPageQueryReqDTO
     * @return
     */
    PageResult<OrdersResDTO> adminPageQuery(OrdersPageQueryReqDTO ordersPageQueryReqDTO);

    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    AdminOrdersDetailResDTO aggregation(Long id);

    /**
     * 滚动分页查询
     * @param ordersStatus
     * @param sortBy
     * @return
     */
    List<OrdersResDTO> userPageQuery(Integer ordersStatus, Long sortBy);

    /**
     * 根据订单id查询
     * @param id
     * @return
     */
    OrdersDetailResDTO detail(Long id);

    /**
     * 根据状态统计订单数量
     * @return
     */
    OrdersCountResDTO countByStatus();


}
